#include "JY61_P.h"

/**
 * @brief       串口X初始化函数
 * @param       pclk: 串口X的时钟源频率(单位: MHz)
 *              串口1 的时钟源来自: PCLK2 = 72Mhz
 *              串口2 - 5 的时钟源来自: PCLK1 = 36Mhz
 * @note        注意: 必须设置正确的sclk, 否则串口波特率就会设置异常.
 * @param       baudrate: 波特率, 根据自己需要设置波特率值
 * @retval      无
 */

void JY61_Init(u32 pclk u32 bound)
{
   float Temp;
   Temp=(pclk * 1000000 + bound / 2) / bound;  /* 得到BRR, 采用四舍五入计算 */
   RCC->APB2ENR|=1<<14;//*使能串口一时钟.
   RCC->APB2ENR|=1<<2;//*使能PA口时钟.
   sys_gpio_set(USART_TX_GPIO_PORT, USART_TX_GPIO_PIN,
                 SYS_GPIO_MODE_AF, SYS_GPIO_OTYPE_PP, SYS_GPIO_SPEED_HIGH, SYS_GPIO_PUPD_PU);   /* 串口TX脚 模式设置 */

    sys_gpio_set(USART_RX_GPIO_PORT, USART_RX_GPIO_PIN,
                 SYS_GPIO_MODE_IN, SYS_GPIO_OTYPE_PP, SYS_GPIO_SPEED_HIGH, SYS_GPIO_PUPD_PU);   /* 串口RX脚 必须设置成输入模式 */
    USART_UX->CR1 = 0;          /* 清零CR1寄存器 */
    USART_UX->CR1 |= 0 << 12;   /* M = 0, 1个起始位, 8个数据位, n个停止位(由USART_CR2 STOP[1:0]指定, 默认是0, 表示1个停止位) */
    USART_UX->CR1 |= 1 << 3;    /* TE = 1, 串口发送使能 */
#if USART_EN_RX  /* 如果使能了接收 */
    /* 使能接收中断 */
    USART_UX->CR1 |= 1 << 2;    /* RE = 1, 串口接收使能 */
    USART_UX->CR1 |= 1 << 5;    /* RXNEIE = 1, 接收缓冲区非空中断使能 */
    sys_nvic_init(3, 3, USART_UX_IRQn, 2); /* 组2，最低优先级 */
#endif
    USART_UX->CR1 |= 1 << 13;   /* UE = 1, 串口使能 */
}

void USART1_IRQHandler(void)//串口中断服务程序
{
    if(USART3->SR&(1<<5))  //判断中断非空
    {
        uint6_t Data =(USART3->DR & (uint16_t)0x01FF);
        Get_Jy61(Data);
    }
    USART3->SR&=~(1<<5);  //清除中断标志位
}

/***********采集JY61P数据**************/
void Get_Jy61(uint16_t Data)
{
    static u8 RX_Data[250];
    static u8 len = 0;
    RX_Data[len++]=Data;    //将收到的数据存入缓冲区中
    if (RX_Data[0]!=0x55) //数据头不对，则重新开始寻找0x55数据头
    {
        len=0;
        return;
    }
    if (len<11) return;//数据不满11个，则返回
    else
    {
     switch(RX_Data[1])//判断数据是哪种数据，然后将其拷贝到对应的结构体中，有些数据包需要通过上位机打开对应的输出后，才能接收到这个数据包的数据
     {
        case 0x51:
                        memcpy(&SAcc,&RX_Data[2],8);
                        for(uint8_t j = 0; j < 3; j++)
                            {
                                SAcc.Acc[j] = (float)SAcc.Acc_S[j]/32768*16;
                            }
                        break;
        case 0x52:
                        memcpy(&SGyro,&RX_Data[2],8);
                        for(uint8_t j = 0; j < 3; j++)
                            {
                                SGyro.Gyro[j] = (float)SGyro.Gyro_S[j]/32768*2000;
                            }
                        break;
        case 0x53:
                        memcpy(&SAngle,&RX_Data[2],8);
                        for(uint8_t j = 0; j < 3; j++)
                            {
                               SAngle.Angle[j] = (float)SAngle.Angle_S[j]/32768*180;
                            }
                        break;
     }
     len=0;//清空缓存区
 }
}
